package br.com.jspl.app.ui;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;
import java.util.LinkedList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import br.com.jspl.app.devices.Cabo;
import br.com.jspl.app.devices.Circuito;
import br.com.jspl.app.devices.Componente;
import br.com.jspl.app.devices.ProtoBoard;

public class FileChoose {
	private ArquivosAction AcaoOpen, AcaoSave;
	private AcaoButton openButton, saveButton;
	private JFileChooser fc;
	private File file;
	private ProtoBoard protoboard;

    public FileChoose(ProtoBoard p) {
    	fc = new JFileChooser();
    	fc.setCurrentDirectory(new File("."));
    	AcaoOpen = new ArquivosAction("Abrir",new ImageIcon(getClass().getClassLoader().getResource("br/com/jspl/imagens/Open16.gif")),1,this);
    	AcaoSave = new ArquivosAction("Salvar",new ImageIcon(getClass().getClassLoader().getResource("br/com/jspl/imagens/Save16.gif")),2,this);
    	openButton= new AcaoButton(AcaoOpen,true);
    	saveButton =new AcaoButton(AcaoSave,true);
    	setProtoboard(p);
    }
    
    public void Salvar() {
    	try {
    		//Abre o arquivo para salvar as informacoes do objeto
    		ObjectOutputStream out = new ObjectOutputStream( new  FileOutputStream(file));
    		Circuito c= protoboard.getCircuitoAtual();
    		LinkedList<Componente> l = c.getListaComponetes();
    		Componente compAt;
    		ComponenteGravacao compGrv = new ComponenteGravacao() ;
    		for(int x=0;x<l.size();x++) {
    			compAt = (Componente) l.get(x);
    			compGrv = new ComponenteGravacao();
    			compGrv.preeche(compAt);
    			out.writeObject(compGrv);
    		}
    		out.close();
    		JOptionPane.showMessageDialog(getProtoboard(),"O arquivo foi salvo.");
    	}
    	catch(Exception e) {
    		JOptionPane.showMessageDialog(getProtoboard(),"Erro ao salvar o arquivo:." +e);
    	}
    }
    
    public void Abrir() {
    	LinkedList<DoisPontos> cabos = new LinkedList<DoisPontos>();
    	Circuito c= protoboard.getCircuitoAtual();
    	try {
    		FileInputStream f = new  FileInputStream(file);
    		ObjectInputStream in = new ObjectInputStream(f);
    		DoisPontos d2;
    		Class classe;
    		Componente compAt;
    		ComponenteGravacao compGrv = new ComponenteGravacao() ;
    		Object[] intArgs = new Object[] {protoboard};    				
    		Cabo cabo;    		    		    		
    		try {
    			while(true) {
    				compGrv = (ComponenteGravacao)in.readObject();
    				classe = compGrv.getClasse();
    				Constructor[] theConstructors = classe.getConstructors();    		
    				compAt = (Componente)theConstructors[0].newInstance(intArgs);    		
    				compAt.setPInicioComponente(compGrv.getPInicioComponente());
    				compAt.setEntradasSaidas(compGrv.getEntradasSaidas());
    				if (compAt instanceof Cabo) {
    					d2 = new DoisPontos(compGrv.getCaboEntrada(),compGrv.getCaboSaida());
    					cabos.add(d2);
    				}
    				else {
    					c.adicionaComponete(compAt);
    					compAt.fuiCarregado();
    				}
    			}
    		}
    		catch(Exception e) {
    			
    		}
    		//Agora executa os cabos
    		DoisPontos pontos;
    		for (int p =0; p<cabos.size();p++) {
    			cabo = new Cabo(protoboard);
    			pontos = (DoisPontos) cabos.get(p);
    			cabo.fuiCarregado(pontos.p1,pontos.p2);
    			c.adicionaComponete(cabo);
    		}
    	}
    	catch(Exception e) {
    		JOptionPane.showMessageDialog(getProtoboard(),"Erro ao abrir o arquivo:." +e);
    	}
	}
    
	public JFileChooser getfc() {
		return fc;
	}
	public JButton getOpenButton() {
		return openButton;
	}

	public JButton getSaveButton() {
		return saveButton;
	}
	public ArquivosAction getAcaoOpen() {
		return AcaoOpen;
	}	
	public ArquivosAction getAcaoSave() {
		return AcaoSave;
	}
	public JFileChooser getFc() {
		return fc;
	}
	public File getFile() {
		return file;
	}
	public void setFile(File file) {
		this.file = file;
	}
	public ProtoBoard getProtoboard() {
		return protoboard;
	}
	public void setProtoboard(ProtoBoard protoboard) {
		this.protoboard = protoboard;
	}
	
}
